package com.xii.oss.Service.impl;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.xii.oss.Service.IOssService;
import com.xii.oss.utils.ConstantPropertiesUtil;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Service
public class OssServiceimpl implements IOssService {
    @Override
    public String uploadFile(MultipartFile file) {


        //使用阿里云OSS官方文档api

        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ConstantPropertiesUtil.END_POINT;
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        // 填写Bucket名称，例如examplebucket。
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        // 填写文件名。文件名包含路径，不包含Bucket名称。例如exampledir/exampleobject.txt。
//        String objectName = "exampledir/exampleobject.txt";

        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

//            String content = "Hello OSS";
            //获得上传文件的输入流
            InputStream inputStream = file.getInputStream();
            //调用oss方法实现上传ossClient.putObject里面有三个参数
//            第一个参数 buctet名称
//            二  上传oss文件路径和文件名称
//            三  文件的输入流

//            获得文件名称
            String filename = file.getOriginalFilename();

            //如果文件名字相同的话 会覆盖文件  所以使用uuid    替换字符串
            String uuid = UUID.randomUUID().toString().replace("-","");
            filename = uuid+filename;
            //文件按照日期做分类 url中/为文件夹分级  这里使用依赖工具类
            //构建日期路径：avatar/2019/02/26/文件名.jpg
            String filePath = new DateTime().toString("yyyy/MM/dd");
            filename = filePath+"/"+filename;

            //执行上传
            ossClient.putObject(bucketName, filename,inputStream);

            //获取 拼接url地址

            String uploadUrl = "http://" + bucketName + "." + endpoint + "/" + filename;

            //返回全部路径用于存储数据库中
            return  uploadUrl;

        } catch (OSSException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }


        return null;
    }
}
